package com.example.java.base.concurrency.lock.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 * ReentrantLockTest:ReentrantLock锁的基本使用默认是非公平的锁(可以通过构造方法传入true改为公平锁)
 * Lock不会像synchronized一样，异常的时候自动释放锁，所以最佳实践是，finally中释放锁，以便保证发生异常的时候锁一定被释放
 * 关于synchronized与ReentrantLock对比和选择,在java并发编程与实战的书上是解释得很清楚了,当然也可以参考网上相关博客
 *
 * @author zhangxiaoxiang
 * @date 2020/11/14
 */
public class ReentrantLockTest {
    private static Lock lock = new java.util.concurrent.locks.ReentrantLock();
 
    public static void main(String[] args) {
        System.out.println("先获取锁");
        //锁【lock.lock】必须紧跟try代码块，且unlock要放到finally第一行。
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "开始执行任务(这里是业务代码)");
        } finally {
            lock.unlock();
            System.out.println("要记得在 try的 finally 里面显示的释放锁哦");
        }
    }
}